package cn.edu.zsc.rbac.domain.util;

import java.lang.reflect.Constructor;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

//这是一个通用的单例工厂类，
// 用于通过反射机制为任意类创建并管理其单例实例（Singleton）。
public class SingletonFactory {
//定义了一个名为 SingletonFactory 的公共工具类。
//不可实例化，因为没有公开构造函数，通常用于提供静态方法供调用。
    private static final Map<Class<?>, Object> instanceMap = new ConcurrentHashMap<>();
    //使用线程安全的 ConcurrentHashMap 来缓存已经创建过的单例对象。
    //Key 是类对象（Class<T>），Value 是对应的单例实例（Object）。
    public static <T> T getInstance(Class<T> clazz) {//获取单例对象
        if (clazz == null) {
            throw new IllegalArgumentException("未知的类型");
        }//如果传入的类对象为 null，抛出非法参数异常。
        if (!instanceMap.containsKey(clazz)) {//如果尚未创建该类的实例，则进入创建流程。
            try {
                Constructor<T> constructor = clazz.getDeclaredConstructor();
                constructor.setAccessible(true);// 允许访问私有构造器
                T singleton = constructor.newInstance();// 创建新实例
                instanceMap.put(clazz, singleton); // 存入缓存
            } catch (Exception e) {
                throw new IllegalArgumentException("创建单例模式失败：" + clazz.getSimpleName(), e);
            }
        }//通过反射获取类的默认构造方法，并创建实例。
        //即使是私有构造器也可以通过 setAccessible(true) 访问，
        // 适用于实现单例的非侵入方式。
        @SuppressWarnings("unchecked")
        T instance = (T) instanceMap.get(clazz);
        return instance;//每次调用 getInstance() 都会返回同一个实例，保证单例特性。
//        Object obj = instanceMap.get(clazz);
//        if (clazz.isInstance(obj)) {
//            return clazz.cast(obj);
//        } else {
//            throw new IllegalArgumentException("创建单例模式失败：" + clazz.getSimpleName());
//        }
    }
}
